
function memorize(func){
    // 定义一个对象负责保存和提供对应的参数和结果
    var cache={};
    return function(){
        // 定义对象的key 由参数形成
        var key = arguments.length+Array.prototype.join.call(arguments,',');
        console.log(key);
        // 如果key 存在 cache中就返回
        if(key in cache){
            return cache[key];
        }else{ //否则执行原来的函数 得到结果并保存
            return cache[key]=func.apply(this,arguments);
        }
    }
}


// 测试一下
// var add = function(a, b, c) {
//     return a + b + c;
// }
  
// var memoizedAdd = memorize(add)

// console.time('use memorize')
// for(var i = 0; i < 100000; i++) {
//     memoizedAdd(1, 2, 3)
// }
// console.timeEnd('use memorize')

// console.time('not use memorize')
// for(var i = 0; i < 100000; i++) {
//     add(1, 2, 3)
// }
// console.timeEnd('not use memorize')

// 当参数是对象是会有问题 使用了 join 方法，
// 我们很容易想到当参数是对象的时候，就会自动调用 toString 方法转换成 [Object object]
var propValue = function(obj){
    return obj.value
}

var memoizedAdd = memorize(propValue)

console.log(memoizedAdd({value: 1})) // 1
console.log(memoizedAdd({value: 2})) // 1
